package com.catazy.album.data

import androidx.room.Room
import com.catazy.album.data.datasource.api.service.AlbumRetrofitService
import com.catazy.album.data.datasource.database.AlbumDatabase
import com.catazy.album.data.repository.AlbumRepositoryImpl
import com.catazy.album.domain.repository.AlbumRepository
import org.koin.dsl.module
import retrofit2.Retrofit

/**
 * 数据模块(koin注入)
 */
internal val dataModule = module {

    // 创建并提供AlbumRepository的单例实例
    // single<AlbumRepository>：定义了一个类型为 AlbumRepository 的单例对象。
    //  这意味着在整个应用程序生命周期中，只会创建一次 AlbumRepository 实例，并且每次需要该类型的对象时都会返回同一个实例
    // 这里的两个get()，通过koin获取实例，是因为下面创建了这里get()需要的实例
    //      第一个get(): single { get<Retrofit>().create(AlbumRetrofitService::class.java) } 这个创建的实例
    //      第二个get(): get<AlbumDatabase>().album() 这个创建的实例
    single<AlbumRepository> { AlbumRepositoryImpl(get(), get()) }

    // 创建并提供AlbumRetrofitService的单例实例
    // 使用Retrofit客户端创建服务接口的实例，以便进行网络请求
    single { get<Retrofit>().create(AlbumRetrofitService::class.java) }

    // 创建并提供AlbumDatabase的单例实例
    // 使用Room数据库构建器创建数据库实例，"Albums.db"是数据库的名称
    single {
        Room.databaseBuilder(
            get(),
            AlbumDatabase::class.java,
            "Albums.db"
        ).build()
    }

    // 提供AlbumDao的单例实例
    // 通过AlbumDatabase实例获取AlbumDao，用于数据库访问和操作
    single { get<AlbumDatabase>().album() }
}